use sea_orm::DatabaseConnection;
use tracing::info;

use super::{
    AuthService, UserService, MenuService, DeptService, 
    PostService, PermissionService, OauthService, RoleService
};

/// 服务管理器 - 统一管理所有服务实例
/// 这个设计避免了在多个地方重复定义服务，提供了统一的服务访问入口
#[derive(Clone)]
pub struct ServiceManager {
    /// 认证服务
    pub auth: AuthService,
    /// 用户服务
    pub user: UserService,
    /// 角色服务
    pub role: RoleService,
    /// 菜单服务
    pub menu: MenuService,
    /// 部门服务
    pub dept: DeptService,
    /// 岗位服务
    pub post: PostService,
    /// 权限服务
    pub permission: PermissionService,
    /// OAuth服务
    pub oauth: OauthService,
}

impl ServiceManager {
    /// 创建新的服务管理器实例
    /// 统一初始化所有服务，确保使用相同的数据库连接
    pub fn new(db: DatabaseConnection) -> Self {
        info!("🚀 初始化服务管理器，创建所有服务实例");
        
        Self {
            auth: AuthService::new(db.clone()),
            user: UserService::new(db.clone()),
            role: RoleService::new(db.clone()),
            menu: MenuService::new(db.clone()),
            dept: DeptService::new(db.clone()),
            post: PostService::new(db.clone()),
            permission: PermissionService::new(db.clone()),
            oauth: OauthService::new(db),
        }
    }

    /// 记录操作日志的通用方法
    pub async fn log_operation(&self, user_id: i32, operation: &str, details: &str) -> Result<(), tonic::Status> {
        info!("记录操作日志: user_id={}, operation={}, details={}", user_id, operation, details);
        
        // 这里可以添加实际的日志记录逻辑
        // 例如：插入操作日志表、发送到日志服务等
        
        Ok(())
    }
}